package com.weactivity;

import com.google.ortools.linearsolver.MPSolver;
import com.google.ortools.linearsolver.MPSolverParameters;
import com.google.ortools.linearsolver.MPVariable;
import com.google.ortools.linearsolver.MPObjective;
import com.google.ortools.linearsolver.MPConstraint;

public class LinearProgrammingExample {
    // 加载 Google OR-Tools 的本地库
    static {
        System.loadLibrary("jniortools");
    }

    public static void main(String[] args) {
        // 创建求解器对象，指定问题类型为线性规划
        MPSolver solver = new MPSolver("LinearProgrammingExample",
                MPSolver.OptimizationProblemType.GLOP_LINEAR_PROGRAMMING);

        // 定义变量的数量
        int n = 3; // 变量数量
        // 目标函数的系数
        double[] c = {3, 5, 2}; // 目标函数系数数组
        // 创建变量数组
        MPVariable[] x = new MPVariable[n];
        for (int i = 0; i < n; i++) {
            // 创建每个变量，定义下界为0，上界为正无穷，变量名称为"x" + i
            x[i] = solver.makeNumVar(0.0, Double.POSITIVE_INFINITY, "x" + i);
        }

        // 创建目标函数对象，并设置为最大化
        MPObjective objective = solver.objective();
        for (int i = 0; i < n; i++) {
            // 设置目标函数中每个变量的系数
            objective.setCoefficient(x[i], c[i]);
        }
        objective.setMaximization(); // 设置目标函数为最大化

        // 定义约束条件的数量
        int m = 2; // 约束条件数量
        // 每个约束条件的系数矩阵
        double[][] a = {
            {2, 3, 1},
            {-1, 2, 3}
        };
        // 约束条件的右侧常数
        double[] b = {12, 4};
        for (int j = 0; j < m; j++) {
            // 创建每个约束条件，定义上界为b[j]，下界为负无穷
            MPConstraint constraint = solver.makeConstraint(Double.NEGATIVE_INFINITY, b[j], "c" + j);
            for (int i = 0; i < n; i++) {
                // 设置每个约束条件中每个变量的系数
                constraint.setCoefficient(x[i], a[j][i]);
            }
        }

        // 求解问题
        MPSolver.ResultStatus resultStatus = solver.solve();

        // 检查结果状态并输出解
        if (resultStatus == MPSolver.ResultStatus.OPTIMAL) {
            System.out.println("Solution:"); // 输出解
            for (int i = 0; i < n; i++) {
                // 输出每个变量的值
                System.out.println("x" + i + " = " + x[i].solutionValue());
            }
            // 输出目标函数的最大值
            System.out.println("Maximum value = " + objective.value());
        } else {
            // 如果没有找到最优解，输出提示
            System.out.println("No optimal solution found.");
        }
    }
}
